package com.aaa.car.service.impl;

import com.aaa.car.dao.CarConfigDao;
import com.aaa.car.dao.CarDao;
import com.aaa.car.dao.MaintainRecordDao;
import com.aaa.car.entity.Car;
import com.aaa.car.entity.CarVo;
import com.aaa.car.entity.MaintainRecord;
import com.aaa.car.service.CarService;
import com.aaa.common.constants.CustomExceptionConstant;
import com.aaa.common.util.CustomException;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * (Car)表服务实现类
 *
 * @author lei chu
 * @since 2021-02-20 19:03:20
 */
@Service("carService")
public class CarServiceImpl implements CarService {
    @Resource
    private CarDao carDao;
    @Resource
    private CarConfigDao carConfigDao;
    @Resource
    private MaintainRecordDao maintainRecordDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Car queryById(Integer id) {
        return this.carDao.queryById(id);
    }

    /**
     * 验证车牌号是否可用
     *
     * @param id id
     * @param vin 要验证的车牌号
     * @return 是否可用
     */
    @Override
    public boolean checkVin(String id, String vin) {
        Car car = this.carDao.queryCarByIdAndVin(id,vin);
        if (car == null){
            return true;
        }
        // 查到了就抛出异常
        throw new CustomException(CustomExceptionConstant.NAME_UNAVAILABLE.getErrorCode(),
                CustomExceptionConstant.NAME_UNAVAILABLE.getErrorMessage());

    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @param pageNum  当前页数
     * @param pageSize 每页条数
     * @param car      实例对象
     * @return 分页数据和信息
     */
    @Override
    public PageInfo<Car> queryAll(int pageNum, int pageSize, Car car) {
        PageInfo<Car> carPageInfo = PageHelper.startPage(pageNum, pageSize)
                .doSelectPageInfo(() -> this.carDao.queryAll(car));
        // 获得汽车列表
        List<Car> list = carPageInfo.getList();
        // 循环汽车列表设置汽车的配置属性
        for (Car car1 : list) {
            car1.setCarConfig(carConfigDao.queryById(car1.getConfigId()));
        }
        return carPageInfo;
    }

    /**
     * 新增数据
     *
     * @param car 实例对象
     * @return 实例对象
     */
    @Override
    public Car insert(Car car) {
        this.carDao.insert(car);
        return car;
    }

    /**
     * 修改数据
     *
     * @param car 实例对象
     * @return 实例对象
     */
    @Override
    public Car update(Car car) {
        this.carDao.update(car);
        return this.queryById(car.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.carDao.deleteById(id) > 0;
    }

    /**
     * 汽车维修好之后的返厂
     *
     * @param maintainRecord 维修信息
     * @return return
     */
    @Override
    public boolean carReturnMaintain(MaintainRecord maintainRecord) {
        int update = carDao.update(new Car().setId(maintainRecord.getId()).setState(1));
        int insert = maintainRecordDao.insert(maintainRecord);
        if (update > 0 && insert > 0){
            return true;
        }
        return false;
    }
    /**
     * 查找满足租出条件的汽车，用于手机端的汽车展示页面
     * @param carVo 租车条件实体
     * @return LIst
     */
    @Override
    public List<Car> queryCarByRentalConditions(CarVo carVo) {
        // 获得汽车列表
        List<Car> list = this.carDao.queryCarByRentalConditions(carVo);
        // 循环汽车列表设置汽车的配置属性
        for (Car car : list) {
            car.setCarConfig(carConfigDao.queryById(car.getConfigId()));
        }
        return list;
    }
}